package cn.edu.wynu.d5_enum;
/*
枚举：枚举是一种特殊类。
枚举类的格式:
修饰符 enum 枚举类名 {
    名称1，名称2，...;
    其他成员...
}

public enum A{
    A1, A2, A3;
    ...
}
注意:
枚举类中的第一行，只能写一些合法的标识符(名称)，多个名称用逗号隔开。
这些名称，本质是常量，每个常量都会记住枚举类的一个对象。
*/

/*
枚举类
public enum A {
    X, Y, Z;
}
源码：
Compiled from "A.java"
public final class A extends java.lang.Enum<A> {
    public static final A X = new A();
    public static final A Y = new A();
    public static final A Z = new A();

    public static A[] values();
    public static A valueOf(java.lang.String);
}

枚举类的特点：
1、枚举类的第一行只能罗列一些名称，这些名称都是常量，并且每个常量记住的都是枚举类的一个对象。
2、枚举类的构造器都是私有的(写不写都只能是私有的)，因此，举类对外不能创建对象。
3、枚举都是最终类，不可以被继承。
4、枚举类中，从第二行开始，可以定义类的其他各种成员。
5、编译器为枚举类新增了几个方法，并且枚举类都是继承:iava.lang.Enum类的，从enum类也会继承到一些方法。
*/

public class Test {
    public static void main(String[] args) {
        // 认识枚举
        A a1 = A.X;
        System.out.println(a1);

        // 2、枚举类的构造器都是私有的，对外不能创建对象。
        // A a2 = new A();

        // 1、枚举类的第一行只能罗列一些名称，这些名称都是常量，并且每个常量记住的都是枚举类的一个对象。
        A a2 = A.Y;

        // 3、枚举类提供一些额外的API
        A[] as = A.values(); // 拿到全部对象
        A a3 = A.valueOf("X"); // 根据名称拿到对象
        System.out.println(a3.name()); // 拿到X名称
        System.out.println(a3.ordinal()); // 拿到索引

        System.out.println("---------------------------------------");

        B y = B.Y;
        y.go();
    }
}
